/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package game;

/**
 *
 * @author Tuan Minh
 */
public class RotateHat  implements Runnable {
        private double x;
        private double max;
        private double a;
        private boolean run;
        private double angle;
        private int status;
        private double tes;
        public double total;
        private boolean isRotate;
        private boolean next;
     /**
      * 
      * @param run
      * @param a
      * @param angle 
      * Phương thức khởi tạo của class RotateHat
      */
        public RotateHat(boolean run, double a,double angle){
            this.a=a;
            this.angle=angle;
            this.run=run;
            this.x=0;
            this.max=0;
            this.next=false;
            this.isRotate=true;
        }
        /**
         * Phương giúp nón quay nhanh dần hoặc chậm dần <br />
         * Phương thức khi gọi sẽ tăng dần góc quay của ảnh, dẫn đến hiệu ứng nón quay nhanh dần hoặc chậm dần <br />
         */
        public void update(){
            this.angle+=this.x;
            this.max +=0.5;
        if(this.max<=this.a){
            this.x=this.x+0.5;
        }else{
            this.x=this.x-0.1;
            if(this.x<0) {
                this.run=false;
                this.isRotate=false;
                this.next=true;
                }
            }        
                    
        }
        /**
         * Phương thức run là nơi thực hiện các công việc của thread :<br />
         * Gọi hàm update, sau 1000/20 ms
         */
        public void run() { 
            while(true){
            if(this.run)  
            update();       
            try{
            Thread.sleep(1000/20);
            }catch(Exception e){
            }
            }
            }
        /**
         * 
         * @param angle Góc quay của nón
         * @param a Lực quay của nón
         * @return  trạng thái cuối cùng của nón sau khi quay
         */
        public int GetStatus(double angle,double a){
        total=angle+0.5*(2*a+1)*a+0.1*(a*10-1)*a*5;
            tes= 360*(total/360-(int)(total/360));
        if((tes/15-(int)(tes/15))>0.5)
            return (int)(tes/15)+1;
        else 
            return (int)(tes/15); 
        }// Get status Hat
        /**
         * 
         * @param status
         */
        public void setStatus(int status) {
            this.status = status;
        }
        /**
         * 
         * @return
         */
        public int getStatus() {
            return this.status;
        }


        /**
         * 
         * @return
         */
        public double getA() {
            return a;
            
        }

        /**
         * 
         * @param a
         */
        public void setA(double a) {
            this.a = a;
        }

        /**
         * 
         * @return
         */
        public double getAngle() {
            return angle;
        }

        /**
         * 
         * @param angle
         */
        public void setAngle(double angle) {
            this.angle = angle;
        }

        /**
         * 
         * @return
         */
        public boolean isRun() {
            return run;
        }

        /**
         * 
         * @param run
         */
        public void setRun(boolean run) {
            this.run = run;
        }

        /**
         * 
         * @return
         */
        public double getMax() {
            return max;
        }

        /**
         * 
         * @param max
         */
        public void setMax(double max) {
            this.max = max;
        }

        /**
         * 
         * @return
         */
        public double getX() {
            return x;
        }

        /**
         * 
         * @param x
         */
        public void setX(double x) {
            this.x = x;
        }

        /**
         * 
         * @return
         */
        public double getTes() {
            return tes;
        }

        /**
         * 
         * @param tes
         */
        public void setTes(double tes) {
            this.tes = tes;
        }

        /**
         * 
         * @return
         */
        public double getTotal() {
            return total;
        }

        /**
         * 
         * @param total
         */
        public void setTotal(double total) {
            this.total = total;
        }

        /**
         * 
         * @return
         */
        public boolean isIsRotate() {
            return isRotate;
        }

        /**
         * 
         * @param isRotate
         */
        public void setIsRotate(boolean isRotate) {
            this.isRotate = isRotate;
        }

        /**
         * 
         * @return
         */
        public boolean isNext() {
            return next;
        }

        /**
         * 
         * @param next
         */
        public void setNext(boolean next) {
            this.next = next;
        }
    
}
